pandas 패키지의 소개

pandas 패키지

  • Index를 가진 자료형인 R의 data.frame 자료형을 Python에서 구현

pandas 자료형

  • Series
    • 시계열 데이터
    • Index를 가지는 1차원 NumPy Array
  • DataFrame
    • 복수 필드 시계열 데이터 또는 테이블 데이터
    • Index를 가지는 2차원 NumPy Array
  • Index
    • Label: 각각의 Row/Column에 대한 이름
    • Name: 인덱스 자체에 대한 이름

Series

  • Row Index를 가지는 자료열
  • 생성
  • 추가/삭제
  • Indexing

명시적인 Index를 가지지 않는 Series


In [1]:
s = pd.Series([4, 7, -5, 3])
s


Out[1]:
0    4
1    7
2   -5
3    3
dtype: int64

In [2]:
s.values


Out[2]:
array([ 4,  7, -5,  3])

In [3]:
type(s.values)


Out[3]:
numpy.ndarray

In [4]:
s.index


Out[4]:
RangeIndex(start=0, stop=4, step=1)

In [5]:
type(s.index)


Out[5]:
pandas.indexes.range.RangeIndex

Vectorized Operation


In [6]:
s * 2


Out[6]:
0     8
1    14
2   -10
3     6
dtype: int64

In [7]:
np.exp(s)


Out[7]:
0      54.598150
1    1096.633158
2       0.006738
3      20.085537
dtype: float64

명시적인 Index를 가지는 Series

  • 생성시 index 인수로 Index 지정
  • Index 원소는 각 데이터에 대한 key 역할을 하는 Label
  • dict

In [8]:
s2 = pd.Series([4, 7, -5, 3], index=["d", "b", "a", "c"])
s2


Out[8]:
d    4
b    7
a   -5
c    3
dtype: int64

In [9]:
s2.index


Out[9]:
Index([u'd', u'b', u'a', u'c'], dtype='object')

Series Indexing 1: Label Indexing

  • Single Label
  • Label Slicing
    • 마지막 원소 포함
  • Label을 원소로 가지는 Label (Label을 사용한 List Fancy Indexing)
    • 주어진 순서대로 재배열

In [10]:
s2['a']


Out[10]:
-5

In [11]:
s2["b":"c"]


Out[11]:
b    7
a   -5
c    3
dtype: int64

In [12]:
s2[['a', 'b']]


Out[12]:
a   -5
b    7
dtype: int64

Series Indexing 2: Integer Indexing

  • Single Integer
  • Integer Slicing
    • 마지막 원소를 포함하지 않는 일반적인 Slicing
  • Integer List Indexing (List Fancy Indexing)
  • Boolearn Fancy Indexing

In [13]:
s2[2]


Out[13]:
-5

In [14]:
s2[1:4]


Out[14]:
b    7
a   -5
c    3
dtype: int64

In [15]:
s2[[2, 1]]


Out[15]:
a   -5
b    7
dtype: int64

In [16]:
s2[s2 > 0]


Out[16]:
d    4
b    7
c    3
dtype: int64

dict 연산


In [17]:
"a" in s2, "e" in s2


Out[17]:
(True, False)

In [18]:
for k, v in s2.iteritems():
    print(k, v)


d 4
b 7
a -5
c 3

In [19]:
s2["d":"a"]


Out[19]:
d    4
b    7
a   -5
dtype: int64

dict 데이터를 이용한 Series 생성

  • 별도의 index를 지정하면 지정한 자료만으로 생성

In [20]:
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
s3 = pd.Series(sdata)
s3


Out[20]:
Ohio      35000
Oregon    16000
Texas     71000
Utah       5000
dtype: int64

In [21]:
states = ['California', 'Ohio', 'Oregon', 'Texas']
s4 = pd.Series(sdata, index=states)
s4


Out[21]:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64

In [22]:
pd.isnull(s4)


Out[22]:
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool

In [23]:
pd.notnull(s4)


Out[23]:
California    False
Ohio           True
Oregon         True
Texas          True
dtype: bool

In [24]:
s4.isnull()


Out[24]:
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool

In [25]:
s4.notnull()


Out[25]:
California    False
Ohio           True
Oregon         True
Texas          True
dtype: bool

Index 기준 연산


In [26]:
print(s3.values, s4.values)
s3.values + s4.values


[35000 16000 71000  5000] [    nan  35000.  16000.  71000.]
Out[26]:
array([    nan,  51000.,  87000.,  76000.])

In [27]:
s3 + s4


Out[27]:
California         NaN
Ohio           70000.0
Oregon         32000.0
Texas         142000.0
Utah               NaN
dtype: float64

Index 이름


In [28]:
s4


Out[28]:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64

In [29]:
s4.name = "population"
s4


Out[29]:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
Name: population, dtype: float64

In [30]:
s4.index.name = "state"
s4


Out[30]:
state
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
Name: population, dtype: float64

Index 변경


In [31]:
s


Out[31]:
0    4
1    7
2   -5
3    3
dtype: int64

In [32]:
s.index


Out[32]:
RangeIndex(start=0, stop=4, step=1)

In [33]:
s.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
s


Out[33]:
Bob      4
Steve    7
Jeff    -5
Ryan     3
dtype: int64

In [34]:
s.index


Out[34]:
Index([u'Bob', u'Steve', u'Jeff', u'Ryan'], dtype='object')

DataFrame

  • Multi-Series
    • 동일한 Row 인덱스를 사용하는 복수 Series
    • Series를 value로 가지는 dict
  • 2차원 행렬
    • DataFrame을 행렬로 생각하면 각 Series는 행렬의 Column의 역할
  • NumPy Array와 차이점
    • 각 Column(Series)마다 type이 달라도 된다.
  • Column Index
    • (Row) Index와 Column Index를 가진다.
    • 각 Column(Series)에 Label 지정 가능
    • (Row) Index와 Column Label을 동시에 사용하여 자료 접근 가능

In [35]:
data = {
    'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    'year': [2000, 2001, 2002, 2001, 2002],
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9]
}
df = pd.DataFrame(data)
df


Out[35]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002

In [36]:
pd.DataFrame(data, columns=['year', 'state', 'pop'])


Out[36]:
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9

In [37]:
df.dtypes


Out[37]:
pop      float64
state     object
year       int64
dtype: object

명시적인 Column/Row Index를 가지는 DataFrame


In [38]:
df2 = pd.DataFrame(data, 
                   columns=['year', 'state', 'pop', 'debt'],
                   index=['one', 'two', 'three', 'four', 'five'])
df2


Out[38]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN

Single Column Access


In [39]:
df["state"]


Out[39]:
0      Ohio
1      Ohio
2      Ohio
3    Nevada
4    Nevada
Name: state, dtype: object

In [40]:
type(df["state"])


Out[40]:
pandas.core.series.Series

In [41]:
df.state


Out[41]:
0      Ohio
1      Ohio
2      Ohio
3    Nevada
4    Nevada
Name: state, dtype: object

Cloumn Data Update


In [42]:
df2['debt'] = 16.5
df2


Out[42]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5

In [43]:
df2['debt'] = np.arange(5)
df2


Out[43]:
year state pop debt
one 2000 Ohio 1.5 0
two 2001 Ohio 1.7 1
three 2002 Ohio 3.6 2
four 2001 Nevada 2.4 3
five 2002 Nevada 2.9 4

In [44]:
df2['debt'] = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
df2


Out[44]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7

Add Column


In [45]:
df2['eastern'] = df2.state == 'Ohio'
df2


Out[45]:
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False

Delete Column


In [46]:
del df2['eastern']
df2


Out[46]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7

inplace 옵션

  • 함수/메소드는 두 가지 종류
    • 그 객체 자체를 변형
    • 해당 객체는 그대로 두고 변형된 새로운 객체를 출력
  • DataFrame 메소드 대부분은 inplace 옵션을 가짐
    • inplace=True이면 출력을 None으로 하고 객체 자체를 변형
    • inplace=False이면 객체 자체는 보존하고 변형된 새로운 객체를 출력

In [47]:
x = [3, 6, 1, 4]
sorted(x)


Out[47]:
[1, 3, 4, 6]

In [48]:
x


Out[48]:
[3, 6, 1, 4]

In [49]:
x.sort()
x


Out[49]:
[1, 3, 4, 6]

drop 메소드를 사용한 Row/Column 삭제

  • del 함수
    • inplace 연산
  • drop 메소드
    • 삭제된 Series/DataFrame 출력
    • Series는 Row 삭제
    • DataFrame은 axis 인수로 Row/Column 선택
      • axis=0(디폴트): Row
      • axis=1: Column

In [50]:
s = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
s


Out[50]:
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
dtype: float64

In [51]:
s2 = s.drop('c')
s2


Out[51]:
a    0.0
b    1.0
d    3.0
e    4.0
dtype: float64

In [52]:
s


Out[52]:
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
dtype: float64

In [53]:
s.drop(["b", "c"])


Out[53]:
a    0.0
d    3.0
e    4.0
dtype: float64

In [54]:
df = pd.DataFrame(np.arange(16).reshape((4, 4)),
                   index=['Ohio', 'Colorado', 'Utah', 'New York'],
                   columns=['one', 'two', 'three', 'four'])
df


Out[54]:
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15

In [55]:
df.drop(['Colorado', 'Ohio'])


Out[55]:
one two three four
Utah 8 9 10 11
New York 12 13 14 15

In [56]:
df.drop('two', axis=1)


Out[56]:
one three four
Ohio 0 2 3
Colorado 4 6 7
Utah 8 10 11
New York 12 14 15

In [57]:
df.drop(['two', 'four'], axis=1)


Out[57]:
one three
Ohio 0 2
Colorado 4 6
Utah 8 10
New York 12 14

Nested dict를 사용한 DataFrame 생성


In [58]:
pop = {
    'Nevada': {
        2001: 2.4, 
        2002: 2.9
    },
    'Ohio': {
        2000: 1.5, 
        2001: 1.7, 
        2002: 3.6
    }
}

In [59]:
df3 = pd.DataFrame(pop)
df3


Out[59]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6

Series dict를 사용한 DataFrame 생성


In [60]:
pdata = {
    'Ohio': df3['Ohio'][:-1],
    'Nevada': df3['Nevada'][:2]
}
pd.DataFrame(pdata)


Out[60]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7

NumPy array로 변환


In [61]:
df3.values


Out[61]:
array([[ nan,  1.5],
       [ 2.4,  1.7],
       [ 2.9,  3.6]])

In [62]:
df2.values


Out[62]:
array([[2000, 'Ohio', 1.5, nan],
       [2001, 'Ohio', 1.7, -1.2],
       [2002, 'Ohio', 3.6, nan],
       [2001, 'Nevada', 2.4, -1.5],
       [2002, 'Nevada', 2.9, -1.7]], dtype=object)

DataFrame의 Column Indexing

  • Single Label key
  • Single Label attribute
  • Label List Fancy Indexing

In [63]:
df2


Out[63]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7

In [64]:
df2["year"]


Out[64]:
one      2000
two      2001
three    2002
four     2001
five     2002
Name: year, dtype: int64

In [65]:
df2.year


Out[65]:
one      2000
two      2001
three    2002
four     2001
five     2002
Name: year, dtype: int64

In [66]:
df2[["state", "debt", "year"]]


Out[66]:
state debt year
one Ohio NaN 2000
two Ohio -1.2 2001
three Ohio NaN 2002
four Nevada -1.5 2001
five Nevada -1.7 2002

In [67]:
df2[["year"]]


Out[67]:
year
one 2000
two 2001
three 2002
four 2001
five 2002